package com.sky.controller.user;

/**
 * @author dongdong 抖音号：W13883155245
 * @version 1.0
 * @date 2025/10/6
 * @description
 */
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayUserInfoShareRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.sky.config.AlipayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.RedirectView;
@Slf4j
@RestController
@RequestMapping("/alipay")
public class AlipayLoginController {

    @Autowired
    private AlipayClient alipayClient; // 注入配置好的支付宝客户端

    /**
     * 接口1：引导用户跳转到支付宝授权页
     */
    @GetMapping("/login")
    public RedirectView alipayLogin() {
        // 拼接支付宝授权链接（scope=auth_user表示获取用户基本信息）
        String authUrl = AlipayConfig.GATEWAY_URL + "?" +
                "app_id=" + AlipayConfig.APP_ID +
                "&scope=auth_user" +
                "&redirect_uri=" + java.net.URLEncoder.encode(AlipayConfig.REDIRECT_URI);
        log.info("重定向到支付宝授权页 authUrl:{}", authUrl);
        // 重定向到支付宝授权页
        return new RedirectView(authUrl);
    }

    /**
     * 接口2：处理支付宝回调（用户授权成功后，支付宝会请求此接口）
     * @param authCode 支付宝返回的授权码（关键参数）
     */
    @GetMapping("/callback1")
    public String alipayCallback1(@RequestParam("auth_code") String authCode) {
        log.info("接口2：处理支付宝回调（用户授权成功后，支付宝会请求此接口）:{}", authCode);
        try {
            // 第一步：用授权码换取 access_token 和用户 user_id
            AlipaySystemOauthTokenRequest tokenRequest = new AlipaySystemOauthTokenRequest();
            tokenRequest.setCode(authCode); // 传入支付宝返回的auth_code
            tokenRequest.setGrantType("authorization_code"); // 固定值
            AlipaySystemOauthTokenResponse tokenResponse = alipayClient.execute(tokenRequest);

            // 校验令牌请求是否成功
            if (!tokenResponse.isSuccess()) {
                return "获取令牌失败：" + tokenResponse.getMsg() + "（" + tokenResponse.getSubMsg() + "）";
            }

            // 第二步：用 access_token 拉取用户基本信息
            String accessToken = tokenResponse.getAccessToken(); // 获取令牌
            AlipayUserInfoShareRequest infoRequest = new AlipayUserInfoShareRequest();
            AlipayUserInfoShareResponse infoResponse = alipayClient.execute(infoRequest, accessToken);

            // 校验用户信息请求是否成功
            if (infoResponse.isSuccess()) {
                // 解析用户信息（可根据需求存储到数据库，或关联网站自身账号）
                String userId = infoResponse.getUserId(); // 支付宝唯一用户ID（关键，用于账号绑定）
                String nickName = infoResponse.getNickName(); // 用户昵称
                String avatar = infoResponse.getAvatar(); // 用户头像URL

                // 返回用户信息（实际项目中可跳转登录成功页，或返回Token）
                JSONObject result = new JSONObject();
                result.put("success", true);
                result.put("userId", userId);
                result.put("nickName", nickName);
                result.put("avatar", avatar);
                return result.toString();
            } else {
                return "获取用户信息失败：" + infoResponse.getMsg() + "（" + infoResponse.getSubMsg() + "）";
            }

        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "回调处理异常：" + e.getMessage();
        }
    }

    /**
     * 接口2：处理支付宝回调（用户授权成功后，支付宝会请求此接口）
     */
    @GetMapping("/callback")
    public String alipayCallback() {
        log.info("接口2：处理支付宝回调（用户授权成功后，支付宝会请求此接口）:{}","teest");
       return "测试通过";
    }
}
